#include "wait_time_func.h"

Func_Manager func_manager ={
	.now_num = 0
};

void REGISTER_FUNC(bool (*func)(void*), uint16_t max_wait_time){
	if(func_manager.now_num < MAX_WAIT_FUNC_NUM){ 
		func_manager.wait_funcs[func_manager.now_num].func = func;
		func_manager.wait_funcs[func_manager.now_num].now_exec_time = 0;
		func_manager.wait_funcs[func_manager.now_num].max_wait_ms = max_wait_time;
		
		func_manager.now_num ++;
	}
}

void EXECUTE_ALL_FUNCS(void *param){
	for(uint8_t i = 0; i < func_manager.now_num; i++){
		if(func_manager.wait_funcs[i].func != NULL && func_manager.wait_funcs[i].now_exec_time < func_manager.wait_funcs[i].max_wait_ms){
			bool result = func_manager.wait_funcs[i].func(param);
			if(result == true){
				UNREGISTER_FUNC_BY_INDEX(i);
			}
			func_manager.wait_funcs[i].now_exec_time ++;
		}else{
			UNREGISTER_FUNC_BY_INDEX(i);
		}
	}
}

bool UNREGISTER_FUNC(bool (*func)(void*)) {
    if (func == NULL || func_manager.now_num == 0)return false;
    for (uint8_t i = 0; i < func_manager.now_num; i++) {
        if (func_manager.wait_funcs[i].func == func) {
            for (uint8_t j = i; j < func_manager.now_num - 1; j++) {
                func_manager.wait_funcs[j] = func_manager.wait_funcs[j + 1];
            }
            func_manager.now_num--;
            return true;
        }
    }
    return false;
}

bool UNREGISTER_FUNC_BY_INDEX(uint8_t index) {
    if(index >= func_manager.now_num) return false;
    for (uint8_t i = index; i < func_manager.now_num - 1; i++) {
        func_manager.wait_funcs[i] = func_manager.wait_funcs[i + 1];
    }
    func_manager.now_num--;
    return true;
}
